package com.ljy.my_study.java8.Function;

import java.util.function.Function;

/** 
* @author James
* @date 2018年11月29日 
*/
public class FunctionTestMain {
	public static void main(String[] args) {
		Function<Integer,Integer> function1=e->e*2;
		Function<Integer,Integer> function2=e->e*e;
		Integer value1=function1.andThen(function2).apply(3);
		System.out.println("andThen value1="+value1);
		Integer value2=function1.compose(function2).apply(3);
		System.out.println("compose value2="+value2);
		Object value3=Function.identity().apply("abc");
		System.out.println(value3);
		System.out.println("-----------------------------");
		FunctionTestMain m=new FunctionTestMain();
		//类里面有两个doSomething方法，通过testDoSomething里面调用来区分是哪个方法
		m.testDoSomething(new Person(), m::doSomething);
		System.out.println("-----------------------------");
		m.testDoSomething(m::doSomething);
	}
	
	//传入TestFunction可以是对象::方法名，当调用TestFunction的doSomething方法的时候即是调用该对象的对应方法
	void testDoSomething(Person p,TestFunction f){
		f.doSomething(p);
	}
	
	void doSomething(Person p) {
		p.run();
	}
	
	void testDoSomething(TestFunction2 f) {
		f.doSomething();
	}
	
	void doSomething() {
		System.out.println("FunctionTestMain doSomething()");
	}
}
